package classes;

import java.util.SortedSet;
import java.util.TreeSet;

public class Dia implements Comparable<Dia> {

	private static final int MAX_HORARIS = 5;
	private Integer numDia;
	private SortedSet<Hora> llistaHores;

	public Dia(Integer numDia) {
		super();
		this.numDia = numDia;
		this.llistaHores = new TreeSet<Hora>();
	}

	public Dia() {
		this.llistaHores = new TreeSet<Hora>();
	}

	public void afegirHora(Hora hora1) {
		// TODO: comprobar excepcions

		llistaHores.add(hora1);
	}
	public Hora getHora(Hora compararHora){
		Hora auxHora=null;
		
		for (Hora hora : llistaHores){
			if (hora.equals(compararHora)){
				auxHora= hora;
				break;
			}
		}
		
		return auxHora;
	}
	

	public Integer getNumDia() {
		return numDia;
	}
	
	

	public void setNumDia(Integer numDia) {
		this.numDia = numDia;
	}

	public SortedSet<Hora> getLlistaHores() {
		return llistaHores;
	}

	public void afegirHores(String token) {

		String[] tokens = token.split("_");

		for (int i = 0; (i < tokens.length) && (i <= MAX_HORARIS); i++) {

			Hora horaIni = new Hora(Integer.parseInt(tokens[i].substring(0, 2)));

			Hora horaFi = new Hora(
					(Integer.parseInt(tokens[i].substring(3, 5))));

			for (int j = horaIni.getNumHora(); j < horaFi.getNumHora(); j++) {

				Hora h = new Hora(j);
				
				this.llistaHores.add(h);
			}
		}

	}

	public void setLlistaHores(SortedSet<Hora> plantillaLlistaHores){
		this.llistaHores=plantillaLlistaHores;
	}
	
	
	@Override
	public int compareTo(Dia o) {
		int numAComparar = o.getNumDia();

		if (numDia < numAComparar) {
			return -1;
		} else if (numDia > numAComparar) {
			return 1;
		} else {
			return 0;
		}
	}
	/*
	@Override
	public boolean equals(Dia auxDia) {
		
		
		return (auxDia.getNumDia()==this.numDia;
	}*/
	
	
	@Override
	public String toString() {
		String auxString="";
		
		for (Hora hora : llistaHores){
			
			auxString+=hora.toString();
			
		}
		
		
		return auxString;
	}

	@Override
	public boolean equals(Object auxDia) {
		// TODO Auto-generated method stub
		return (((Dia)auxDia).getNumDia().equals(this.getNumDia()));
	}

	public int afegirActivitatPlantillaHores(Activitat activitat,
			Dia plantillaHores) {
		int contadorActivitatsAfegides=0;
		
		
		
		if (this.getLlistaHores()==null){
			this.llistaHores= plantillaHores.getLlistaHores();
			return this.llistaHores.size();
		}
		
		if (this.getLlistaHores().isEmpty()){ 
			this.setLlistaHores(plantillaHores.getLlistaHores());
			
			for (Hora hora : plantillaHores.getLlistaHores()){
				hora.setActivitat(activitat);
				this.getLlistaHores().add(hora);
				contadorActivitatsAfegides++;
			}
		}else{
			for (Hora hora : plantillaHores.getLlistaHores()){
				Hora auxHora=this.getHora(hora);
				if ((auxHora!=null)){
					if (auxHora.conteActivitat(activitat)){  // SI ja te activitat, pero es la mateixa: conta com a afegida
						contadorActivitatsAfegides++;
					}else{
						if (!activitat.getClass().equals(ActivitatTancat.class)) { // si no es activitat tancada: retorna 0 i acaba el proces
							return 0;
						}										
					}
				}else{
					hora.setActivitat(activitat);
					this.getLlistaHores().add(hora);
					contadorActivitatsAfegides++;
				}
			}
		}
		
		return contadorActivitatsAfegides;
	}

	public void merge(Dia auxAfegir) {
		boolean trobat=false;
		
		
		for (Hora auxNouAfegir : auxAfegir.llistaHores){
			trobat=false;
			for (Hora auxOriginal : this.llistaHores){
				if (auxOriginal.equals(auxNouAfegir)){
					auxOriginal.merge(auxNouAfegir);
					trobat=true;
				}
			}
			if (!trobat){
				this.afegirHora(auxNouAfegir);
			}
			
		}
		
	}

}
